/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modulo3;

import Modelo.Extintor;
import Acceso.Security;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

/**
 *
 * @author Francis
 */
public class agregarExtintorAction extends org.apache.struts.action.Action {

    /* forward name="success" path="" */
    private static final String SUCCESS = "success";
    private static final String FAILURE = "failure";
    private static final String[] ALLOWED = {"Administrador", "Gestionar Sistemas de Extincion"};

    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        if (!Security.validateSession(request, ALLOWED)) {
            Security.privilegeError(response);
            return mapping.findForward("errorPriv");
        }

        agregarExtintorForm formBean = (agregarExtintorForm) form;
        String idNroBien = formBean.getId_nro_bien();
        String sede = formBean.getSede();
        String piso = formBean.getPiso();
        String edificio = formBean.getEdificio();
        String tipo = formBean.getTipo();
        String capacidad = formBean.getCapacidad();
        String fechaUltimaRecarga = formBean.getFecha_ultima_recarga();
        String status = formBean.getStatus();
        String personaContacto = formBean.getPersona_contacto();
        String senalizado = formBean.getSenalizado();
        String usado = formBean.getUsado();
        String referencia = formBean.getReferencia();
        String categoria = formBean.getCategoria();
        String coordenadas = formBean.getCoordenadas();
        ActionErrors errors = new ActionErrors();
        boolean error = false;
        Pattern p;
        Matcher m;

        if (idNroBien == null || idNroBien.equals("")) {
            errors.add("ext_nro_bien", new ActionMessage("errors.ext_nro_bien_requerido"));
            saveErrors(request, errors);
            error = true;
        } else {
            // Verificación de que el teléfono sólo tenga caracteres numéricos
            p = Pattern.compile("[0-9]*");
            m = p.matcher(idNroBien);
            if (!m.matches()) {
                errors.add("ext_nro_bien", new ActionMessage("errors.ext_nro_bien_formato"));
                saveErrors(request, errors);
                error = true;
            } else {
                try {
                    if (Integer.parseInt(idNroBien) <= 0) {
                        errors.add("ext_nro_bien", new ActionMessage("errors.ext_nro_bien_mayor_cero"));
                        saveErrors(request, errors);
                        error = true;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        if (sede == null || sede.equals("")) {
            errors.add("ext_sede", new ActionMessage("errors.ext_sede_requerido"));
            saveErrors(request, errors);
            error = true;
        }

        if (edificio == null || edificio.equals("")) {
            errors.add("ext_edificio", new ActionMessage("errors.ext_edificio_requerido"));
            saveErrors(request, errors);
            error = true;
        }

        if (piso == null || piso.equals("")) {
            errors.add("ext_piso", new ActionMessage("errors.ext_piso_requerido"));
            saveErrors(request, errors);
            error = true;
        }

        if (tipo == null || tipo.equals("")) {
            errors.add("ext_tipo", new ActionMessage("errors.ext_tipo_requerido"));
            saveErrors(request, errors);
            error = true;
        } else {
            // Verificación de que el nombre sólo tenga caracteres alfabéticos
            p = Pattern.compile("[^a-zA-Z0-9\\. ]+");
            m = p.matcher(tipo);
            if (m.find()) {
                errors.add("ext_tipo", new ActionMessage("errors.ext_tipo_formato"));
                saveErrors(request, errors);
                error = true;
            }
        }

        if (capacidad == null || capacidad.equals("")) {
            errors.add("ext_capacidad", new ActionMessage("errors.ext_capacidad_requerido"));
            saveErrors(request, errors);
            error = true;
        } else {
            // Verificación de que el nombre sólo tenga caracteres alfabéticos
            p = Pattern.compile("[^a-zA-Z0-9 ]+");
            m = p.matcher(capacidad);
            if (m.find()) {
                errors.add("ext_capacidad", new ActionMessage("errors.ext_capacidad_formato"));
                saveErrors(request, errors);
                error = true;
            }
        }

        if (fechaUltimaRecarga == null || fechaUltimaRecarga.equals("")) {
            errors.add("ext_fecha_ultimo", new ActionMessage("errors.ext_fecha_ultimo_requerido"));
            saveErrors(request, errors);
            error = true;
        }

//    ***************** Validacion de Fecha ******************
        try {

            // Se obtiene la fecha actual en el formato del script
            Calendar c = new GregorianCalendar();
            String dia, mes, annio;
            dia = Integer.toString(c.get(Calendar.DATE));
            mes = Integer.toString(c.get(Calendar.MONTH) + 1);
            annio = Integer.toString(c.get(Calendar.YEAR));
            String fechaHoy = dia + "/" + mes + "/" + annio;
            // Fin de obtener la fecha actual

            String DATE_FORMAT = "dd/MM/yyyy";
            SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
            Date c1 = sdf.parse(fechaHoy);
            Date primera = sdf.parse("01/01/1970");
            sdf.setLenient(false);
            Date c2 = sdf.parse(fechaUltimaRecarga);

            // Si la fecha elegida es posterior a la fecha actual
            if (c2.after(c1)) {
                errors.add("ext_fecha_ultimo", new ActionMessage("errors.ext_fecha_ultimo_actual"));
                saveErrors(request, errors);
                error = true;
            }
            if (c2.before(primera)) {
                errors.add("ext_fecha_ultimo", new ActionMessage("errors.ext_fecha_ultimo_antes_creacion"));
                saveErrors(request, errors);
                error = true;
            }

        } catch (Exception e) {
            e.printStackTrace();
            errors.add("ext_fecha_ultimo", new ActionMessage("errors.ext_fecha_ultimo_formato"));
            saveErrors(request, errors);
            error = true;
        }
//********************************************************************************

        if (status == null || status.equals("")) {
            errors.add("ext_status", new ActionMessage("errors.ext_status_requerido"));
            saveErrors(request, errors);
            error = true;
        }

        if (personaContacto == null || personaContacto.equals("")) {
            errors.add("ext_persona_contacto", new ActionMessage("errors.ext_persona_contacto_requerido"));
            saveErrors(request, errors);
            error = true;
        } else {
            // Verificación de que el nombre sólo tenga caracteres alfabéticos
            p = Pattern.compile("[^a-zA-Z ]+");
            m = p.matcher(personaContacto);
            if (m.find()) {
                errors.add("ext_persona_contacto", new ActionMessage("errors.ext_persona_contacto_formato"));
                saveErrors(request, errors);
                error = true;
            }
        }

        if (referencia == null || referencia.equals("")) {
            errors.add("ext_referencia", new ActionMessage("errors.ext_referencia_requerido"));
            saveErrors(request, errors);
            error = true;
        }

        if (categoria == null || categoria.equals("")) {
            errors.add("ext_categoria", new ActionMessage("errors.ext_categoria_requerido"));
            saveErrors(request, errors);
            error = true;
        }
        if (error) {
            return mapping.findForward(FAILURE);
        }
        Extintor ext = new Extintor(idNroBien, sede, piso, edificio, tipo, capacidad, fechaUltimaRecarga, status, personaContacto, senalizado, usado, referencia, coordenadas, categoria);

        if (Modelo.DAL.Extintor_DAO.insertarExtintor(ext)) {
            return mapping.findForward(SUCCESS);
        } else {
            errors.add("ext_sede", new ActionMessage("errors.ext_sede_requerido"));
            saveErrors(request, errors);
            error = true;
            formBean.setError("El Número de bien del extintor ya existe en la base de datos.");
            return mapping.findForward(FAILURE);
        }
    }
}
